<?php if (!defined('BASEPATH')) exit ('No direct script access allowed');

include_once 'ExceptionDAO.php';
include_once 'daocontroleacesso.php';
include_once 'mensagem.php';
include_once 'ExceptionValidacao.php';
include_once 'TOUsuario.php';

/**
 * Representacao o controle de acesso do sistema.
 * @author Douglas Rafael
 * @package models
 */
class ControleAcesso extends CI_Model {
    // Constantes com as variáveis para guardar na sessão
    const USU_ID = 'usu_id';
    const USU_SHORTNAME = 'usu_shortname';
    const USU_LASTNAME = 'usu_lastname';
    const USU_LOGGED = 'usu_logged';
    const USU_ULTIMO_LOGIN = 'usu_ultimo_login';
    const USU_TOTAL_LOGIN = 'usu_total_login';
    const SUPER_ADMIN = 'super_admin';

    // CONSULTAS
    const CONSULTAR_AUTOR = 10;
    const CONSULTAR_EDITORA = 11;
    const CONSULTAR_CATEGORIA = 12;
    const CONSULTAR_USUARIO = 13;
    const CONSULTAR_LIVRO = 14;
    const CONSULTAR_MAGAZINE = 15;
    const CONSULTAR_MIDIA = 16;
    const CONSULTAR_EMPRESTIMO = 17;
    const CONSULTAR_GRUPO = 18;
    const CONSULTAR_MULTA = 19;
    const CONSULTAR_RELATORIO = 20;
    const CONSULTAR_EMAIL = 21;
    const CONSULTAR_COMENTARIO = 22;
    

    // CADASTROS
    const CADASTRAR_AUTOR = 30;
    const CADASTRAR_EDITORA = 31;
    const CADASTRAR_CATEGORIA = 32;
    const CADASTRAR_USUARIO = 33;
    const CADASTRAR_LIVRO = 34;
    const CADASTRAR_MAGAZINE = 35;
    const CADASTRAR_MIDIA = 36;
    const CADASTRAR_EMPRESTIMO = 37;
    const CADASTRAR_GRUPO = 38;
    const CADASTRAR_MULTA = 39;
    const CADASTRAR_COMETARIO = 40;
    const CADASTRAR_EMAIL = 41;

    // ATUALIZAÇÕES
    const ATUALIZAR_AUTOR = 50;
    const ATUALIZAR_EDITORA = 51;
    const ATUALIZAR_CATEGORIA = 52;
    const ATUALIZAR_USUARIO = 53;
    const ATUALIZAR_LIVRO = 54;
    const ATUALIZAR_MAGAZINE = 55;
    const ATUALIZAR_MIDIA = 56;
    const ATUALIZAR_EMPRESTIMO = 57;
    const ATUALIZAR_GRUPO = 58;
    const ATUALIZAR_MULTA = 59;
    const ATUALIZAR_COMENTARIO = 60;
    const ATUALIZAR_EMAIL = 61;

    // EXCLUSOES
    const EXCLUIR_AUTOR = 70;
    const EXCLUIR_EDITORA = 71;
    const EXCLUIR_CATEGORIA = 72;
    const EXCLUIR_USUARIO = 73;
    const EXCLUIR_LIVRO = 74;
    const EXCLUIR_MAGAZINE = 75;
    const EXCLUIR_MIDIA = 76;
    const EXCLUIR_EMPRESTIMO = 77;
    const EXCLUIR_GRUPO = 78;
    const EXCLUIR_MULTA = 79;
    const EXCLUIR_COMENTARIO = 80;
    const EXCLUIR_EMAIL = 81;
    
    // CONFIG
    const CONFIG_SYSTEM = 90;
    
    /**
     * Verifica se um usuário tem permissão para executar uma ação.
     * 
     * @param int $acao O id da ação.
     * @return bool True se tem permissão ou False se não tem.
     */
    public function checaPermicao($idAcao) {
        $this->load->model("DAOUsuario");
        return $this->DAOUsuario->temPermissao($this->get_user_logged(), $idAcao);
    }

     /**
     * Realiza a autenticação do usuário no sistema.
     */
    public function autenticaUsuario() {
        $usuario = new TOUsuario();
        $usuario->login = $this->input->post('login', TRUE);
        $usuario->senha = $this->input->post('password', FALSE);

        $this->load->model("DAOUsuario");
        $usuario_logged = $this->DAOUsuario->autenticarUser($usuario);

        if ($usuario_logged) {
            $data = array(
                self::USU_ID => $usuario_logged->id,
                self::USU_SHORTNAME => $usuario_logged->nome,
                self::USU_LASTNAME => $usuario_logged->sobrenome,
                self::USU_ULTIMO_LOGIN => $usuario_logged->ultimo_login,
                self::USU_TOTAL_LOGIN => $usuario_logged->quantidade_login,
                self::SUPER_ADMIN => $usuario_logged->super_admin,
                self::USU_LOGGED => TRUE);

            $this->session->set_userdata($data);
            
            // Salva na sessão dados utilizados no sistema
            Main::check_config();
            
            /**
             * Verifica o auto multa
             * Se estiver ativado o processo é executado
             */
            if($this->session->userdata(Main::AUTO_MULTA)) {
                $this->load->model('DAOMulta');
                $this->DAOMulta->set_auto_fine($this->DAOMulta->ckeck_set_fine());
            }
        }
    }
    
    /**
     * Verifica se um usuário está autenticado no sistema.
     *
     * @return TRUE Se o usuário tem dados na sessão e se estes correspondem ao
     * sistema em questão
     */
    public function checkLogged() {
        return $this->session->userdata(self::USU_LOGGED);
    }

    /**
     * Destroi a sessao
     */
    public function logoutUser() {
        $this->session->sess_destroy();
    }

    /**
     * Retorna o id do usuário logado
     * 
     * @return int id do usuário
     */
    public function get_user_logged() {
        return $this->session->userdata(self::USU_ID);
    }

}